home *** CD-ROM | disk | FTP | other *** search
/ EuroCD 3 / EuroCD 3.iso / Graphics_Utils / aMiPEG_1.1 / src / svid2.s < prev    next >
Text File  |  1998-06-24  |  10KB  |  646 lines

  1. ;
  2. ; SAS/C isn't capable of inlining assembler subroutines, nor does it produce
  3. ; appropriate code for straight division/modulo operations, nor does it .....
  4. ; So, let's it do the work, and then I do the rest to it.
  5. ;
  6. ; Michael Rausch, 3/94
  7. ;
  8.  
  9.     SECTION    text,CODE
  10.  
  11.     XREF    _clamp
  12.  
  13.  
  14.     XREF    _BIMcm_reconstruct
  15.     XREF    _BIM_reconstruct
  16.     XREF    _BMcm_reconstruct
  17.     XREF    _BM_reconstruct
  18.  
  19.     XDEF    @ReconIMBlock
  20.     XDEF    @ReconPMBlock
  21.     XDEF    @ReconBMBlock
  22.     XDEF    @ReconBiMBlock
  23.  
  24.  
  25. @ReconIMBlock:
  26.     MOVEM.L    D4-D7/A3,-(A7)
  27.     MOVE.L  D0,D7
  28.     MOVE.L  $c(A0),D6
  29.     MOVE.L  $86(A0),D4
  30.     divu.w  d6,D4
  31.     moveq    #0,d5
  32.     move.w    d4,d5
  33.     swap    d4
  34.     ext.l    d4
  35.     move.L    $178(a0),a1
  36.     MOVEQ.L    #$4,D0
  37.     CMP.L    D0,D7
  38.     BGE.B    ReconIMBlock__7
  39.     lSL.L    #$4,D5
  40.     lSL.L    #$4,D4
  41.     MOVEQ    #$1,D1
  42.     CMP.L    D1,D7
  43.     BLE.B    ReconIMBlock__4
  44.     ADDQ.L    #$8,D5
  45. ReconIMBlock__4:
  46.     BTST    #$0,D7
  47.     BEQ.B    ReconIMBlock__6
  48.     ADDQ.L    #$8,D4
  49. ReconIMBlock__6:
  50.     lSL.L    #$4,D6
  51.     MOVE.L    (A1),A3
  52.     BRA.B    ReconIMBlock__10
  53. ReconIMBlock__7:
  54.     lSL.L    #$3,D4
  55.     lSL.L    #$3,D5
  56.     lSL.L    #$3,D6
  57.     SUBQ.L    #$4,D7
  58.     BNE.B    ReconIMBlock__9
  59.     MOVE.L    $4(A1),A3
  60.     BRA.B    ReconIMBlock__10
  61. ReconIMBlock__9:
  62.     MOVE.L    $8(A1),A3
  63. ReconIMBlock__10:
  64.     MULu.w    D6,D5
  65.     add.w    #$d2,a0
  66.     ADD.L    D5,A3
  67.     ADD.L    D4,A3
  68.  
  69.     lea    _clamp,a1
  70.     subq.l    #8,d6            ; correct row_size
  71.     moveq    #7,d4
  72. cdct_all_rows:
  73.     REPT    2
  74.     move.w    (a0)+,d1
  75.     move.w    (a1,d1.w*2),d5
  76.     move.w    (a0)+,d1
  77.     move.b    (a1,d1.w*2),d5
  78.     swap    d5
  79.     move.w    (a0)+,d1
  80.     move.w    (a1,d1.w*2),d5
  81.     move.w    (a0)+,d1
  82.     move.b    (a1,d1.w*2),d5
  83.     move.l    d5,(a3)+
  84.     ENDR
  85.     add.l    d6,a3
  86.     dbra    d4,cdct_all_rows
  87.  
  88.     movem.l    (A7)+,D4-D7/A3
  89.     rts
  90.  
  91.  
  92.  
  93.  
  94. @ReconPMBlock:
  95.     SUB.W    #$1c,A7
  96.     MOVEM.L D2/D3/D4/D6/D7/A2/A3/A5,-(A7)
  97.  
  98.     MOVE.L    D0,D4
  99.     MOVE.L    $c(A0),D7
  100.     MOVE.L    $178(A0),A3
  101.     MOVE.L    $86(A0),D2
  102.     DIVu.w    D7,D2
  103.     moveq    #0,d6
  104.     move.w    d2,d6
  105.     swap    d2
  106.     LEA    $24(A7),A5
  107.     ext.l    d2
  108.     MOVE.L    D0,(A5)+
  109.     MOVE.L    D1,(A5)+
  110.     MOVE.L    A0,(A5)+
  111.  
  112.  
  113.     MOVEQ.L    #$4,D0
  114.     CMP.L    D0,D4
  115.     BGE.B    ReconPMBlock__12
  116. ReconPMBlock__2:
  117.     MOVEQ.L    #$1,D0
  118.     AND.L    D1,D0
  119.     MOVEQ.L    #$1,D3
  120.     LEA    $40(A7),A5
  121.     AND.L    (A5),D3
  122.     aSR.L    #$1,D1
  123.     MOVE.L    D1,$28(A7)
  124.     MOVE.L    (A5),D1
  125.     aSR.L    #$1,D1
  126.     MOVE.L    (A3),A2
  127.     MOVE.L    D1,(A5)+
  128.     MOVE.L    D0,$34(A7)
  129.     MOVE.L    D3,$30(A7)
  130.  
  131.     MOVEQ.L    #$3,D0
  132.     CMP.L    $4e(A0),D0
  133.     BNE.B    ReconPMBlock__5
  134. ReconPMBlock__3:
  135.     MOVE.L    $170(A0),A1
  136.     BRA.B    ReconPMBlock__7
  137. ReconPMBlock__5:
  138.     MOVE.L    $174(A0),A1
  139. ReconPMBlock__7:
  140.     MOVE.L    A1,D3
  141.     BEQ    ReconPMBlock__34    ; error, no future/past frame! not in the original code!
  142.     MOVE.L     (A1),A3
  143. ReconPMBlock__8:
  144.  
  145.     lSL.L    #$4,D7
  146.     MOVE.L    D6,D0
  147.     lSL.L    #$4,D0
  148.     MOVE.L    D2,D6
  149.     lSL.L    #$4,D6
  150.     MOVE.L    D0,$38(A7)
  151.     MOVEQ.L    #$1,D1
  152.     CMP.L    D1,D4
  153.     BLE.B    ReconPMBlock__10
  154. ReconPMBlock__9:
  155.     ADDQ.L    #$8,$38(A7)
  156. ReconPMBlock__10:
  157.     BTST    #$0,D4
  158.     BEQ.W    ReconPMBlock__24
  159. ReconPMBlock__11:
  160.     ADDQ.L    #$8,D6
  161.     BRA.W    ReconPMBlock__24
  162. ReconPMBlock__12:
  163.     MOVEQ.L    #$2,D0
  164.     AND.L    D1,D0
  165.     aSR.L    #$1,D0
  166.     MOVEQ.L    #$2,D3
  167.     LEA    $40(A7),A5
  168.     AND.L    (A5),D3
  169.     aSR.L    #$2,D1
  170.     MOVE.L    D1,$28(A7)
  171.     MOVE.L    (A5),D1
  172.     aSR.L    #$2,D1
  173.     lSL.L    #$3,D7
  174.     MOVE.L    D1,(A5)+
  175.     MOVE.L    D6,D1
  176.     lSL.L    #$3,D1
  177.     MOVE.L    D2,D6
  178.     lSL.L    #$3,D6
  179.     MOVE.L    D1,$38(A7)
  180.     MOVE.L    D0,$34(A7)
  181.     MOVE.L    D3,$30(A7)
  182.  
  183.     move.l    $4e(a0),d0
  184.     subq.l    #$3,d0
  185.     bne.s    ReconPMB_11
  186.     MOVE.L    $170(A0),A1
  187.     bra.s    ReconPMB_12
  188. ReconPMB_11:
  189.     MOVE.L    $174(A0),A1
  190. ReconPMB_12:
  191.     move    a1,d0
  192.     beq    ReconPMBlock__34    ; no future/past frame!
  193.  
  194.     SUBQ.L    #$4,D4
  195.     BNE.B    ReconPMBlock__18
  196. ReconPMBlock__13:
  197.     MOVE.L    $4(A3),A2
  198.     MOVE.L    $4(A1),A3
  199.     BRA.B    ReconPMBlock__24
  200. ReconPMBlock__18:
  201.     MOVE.L    $8(A3),A2
  202.     MOVE.L    $8(A1),A3
  203.  
  204. ReconPMBlock__24:
  205.     MOVE.L    $38(A7),D1 
  206.     MULS.w    D7,D1
  207.     MOVE.L    A3,A5
  208.     ADD.L    D6,D1
  209.     ADD.L    D1,A2
  210.     MOVE.L    $38(A7),D1
  211.     ADD.L    $40(A7),D1
  212.     MULs.w    D7,D1
  213.     ADD.L    D6,D1
  214.     ADD.L    $28(A7),D1
  215.     ADD.L    D1,A5
  216.     MOVE.L    $30(A7),D1
  217.     MOVE.L    $34(A7),D2
  218.     MOVE.L    $44(A7),D3
  219.  
  220.  
  221.     TST.L    D1
  222.     BNE    ReconPMBlock__29
  223. ReconPMBlock__25:
  224.     TST.L    D2
  225.     BNE    ReconPMBlock__29
  226. ReconPMBlock__26:
  227.     subq.l    #8,d7            ; correct row_size
  228.     TST.L    D3
  229.     BNE.B    ReconPMBlock__28
  230.  
  231. ReconPMBlock__27:
  232.     lea    _clamp,a3
  233.     LEA    $d2(A0),A1
  234.     moveq    #7,d0
  235. bmcm_all_rows1:
  236.     REPT    2
  237.     move.l    (a5)+,d3
  238.     moveq    #0,d1
  239.     move.b    d3,d1
  240.     lsr.l    #8,d3
  241.     moveq    #0,d4
  242.     move.b    d3,d4
  243.     lsr.w    #8,d3
  244.     add.l    (a1)+,d3
  245.     move.w    d3,d2
  246.     swap    d3
  247.     move.w    (a3,d3.w*2),d3
  248.     move.b    (a3,d2.w*2),d3
  249.     swap    d3
  250.     add.w    (a1)+,d4
  251.     add.w    (a1)+,d1
  252.     move.w    (a3,d4.w*2),d3
  253.     move.b    (a3,d1.w*2),d3
  254.     move.l    d3,(a2)+
  255.     ENDR
  256.     add.l    d7,a2
  257.     add.l    d7,a5
  258.     dbra    d0,bmcm_all_rows1
  259.  
  260.     bra    ReconPMBlock__34
  261.  
  262. ReconPMBlock__28:
  263.     moveq    #3,d1
  264. bm_all_rows1:
  265.     rept    2
  266.     move.l    (a5)+,(a2)+
  267.     move.l    (a5)+,(a2)+
  268.     add.l    d7,a2
  269.     add.l    d7,a5
  270.     endr
  271.     dbra    d1,bm_all_rows1
  272.  
  273.     bra    ReconPMBlock__34
  274.  
  275.  
  276. ReconPMBlock__29:
  277.     sub.l    a3,a3
  278.     TST.L    D1
  279.     BEQ.B    ReconPMBlock__31
  280. ReconPMBlock__30:
  281.     move.l    d7,a3
  282. ReconPMBlock__31:
  283.     add.L    A5,A3
  284.     ADD.L    D2,A3
  285.  
  286.     subq.l    #8,d7            ; correct row_size
  287.     move.l    #$fefefefe,d4
  288.     moveq    #7,d0
  289.  
  290.     TST.L    D3
  291.     BNE    ReconPMBlock__33
  292. ReconPMBlock__32:
  293.  
  294.     MOVE.L    $2c(A7),A1
  295.     ADD.W    #$d2,A1
  296.     lea    _clamp,a0
  297. bimcm_all_rows1:
  298.     REPT    2
  299.     move.l    (a5)+,d1
  300.     move.l    (a3)+,d3
  301.     and.l    d4,d1
  302.     and.l    d4,d3
  303.     add.l    d1,d3
  304.     roxr.l    #1,d3        ; tricky! get bit #32 from the previous addition
  305.     moveq    #0,d1
  306.     move.b    d3,d1
  307.     lsr.l    #8,d3
  308.     moveq    #0,d6
  309.     move.b    d3,d6
  310.     lsr.w    #8,d3        ; *grin evilly*  eadiz, peecee  *strut*
  311.     add.l    (a1)+,d3
  312.     move.w    d3,d2
  313.     swap    d3
  314.     move.w    (a0,d3.w*2),d3
  315.     move.b    (a0,d2.w*2),d3
  316.     swap    d3
  317.     add.w    (a1)+,d6
  318.     add.w    (a1)+,d1
  319.     move.w    (a0,d6.w*2),d3
  320.     move.b    (a0,d1.w*2),d3
  321.     move.l    d3,(a2)+
  322.     ENDR
  323.     add.l    d7,a2
  324.     add.l    d7,a5
  325.     add.l    d7,a3
  326.     dbra    d0,bimcm_all_rows1
  327.  
  328.     BRA    ReconPMBlock__34
  329. ReconPMBlock__33:
  330.  
  331. bim_all_rows1:
  332.     REPT    2
  333.     move.l    (a5)+,d1
  334.     move.l    (a3)+,d2
  335.     and.l    d4,d1
  336.     and.l    d4,d2
  337.     add.l    d1,d2
  338.     roxr.l    #1,d2            ; tricky! get bit no 32 from the previous addition
  339.     move.l    d2,(a2)+        ; this one kicks ass !!!
  340.     ENDR
  341.     add.l    d7,a2
  342.     add.l    d7,a5
  343.     add.l    d7,a3
  344.     dbra    d0,bim_all_rows1
  345.  
  346. ReconPMBlock__34:
  347.     MOVEM.L    (A7)+,D2/D3/D4/D6/D7/A2/A3/A5
  348.     ADD.W    #$1c,A7
  349.     RTS
  350.  
  351.  
  352.  
  353.  
  354.  
  355.  
  356. @ReconBMBlock:
  357.     SUB.W    #$1c,A7
  358.     MOVEM.L D2/D3/D4/D6/D7/A2/A3/A5,-(A7)
  359.  
  360.     MOVE.L    D0,D4
  361.     MOVE.L    $c(A0),D7
  362.     MOVE.L    $178(A0),A3
  363.     MOVE.L    $86(A0),D2
  364.     DIVu.w    D7,D2
  365.     moveq    #0,d6
  366.     move.w    d2,d6
  367.     swap    d2
  368.     LEA    $24(A7),A5
  369.     ext.l    d2
  370.     MOVE.L    D0,(A5)+
  371.     MOVE.L    D1,(A5)+
  372.     MOVE.L    A0,(A5)+
  373.  
  374.  
  375.     MOVEQ.L    #$4,D0
  376.     CMP.L    D0,D4
  377.     BGE.B    ReconBMBlock__12
  378. ReconBMBlock__2:
  379.     MOVEQ.L    #$1,D0
  380.     AND.L    D1,D0
  381.     MOVEQ.L    #$1,D3
  382.     LEA    $40(A7),A5
  383.     AND.L    (A5),D3
  384.     aSR.L    #$1,D1
  385.     MOVE.L    D1,$28(A7)
  386.     MOVE.L    (A5),D1
  387.     aSR.L    #$1,D1
  388.     MOVE.L    (A3),A2
  389.     MOVE.L    D1,(A5)+
  390.     MOVE.L    D0,$34(A7)
  391.     MOVE.L    D3,$30(A7)
  392.     MOVE.L    $4e(A0),D1
  393.  
  394.     MOVE.L    $174(A0),A1
  395.     MOVE.L    A1,D3
  396.     BEQ.B    ReconPMBlock__34
  397.     MOVE.L     (A1),A3
  398.  
  399.     lSL.L    #$4,D7
  400.     MOVE.L    D6,D0
  401.     lSL.L    #$4,D0
  402.     MOVE.L    D2,D6
  403.     lSL.L    #$4,D6
  404.     MOVE.L    D0,$38(A7)
  405.     MOVEQ.L    #$1,D1
  406.     CMP.L    D1,D4
  407.     BLE.B    ReconBMBlock__10
  408. ReconBMBlock__9:
  409.     ADDQ.L    #$8,$38(A7)
  410. ReconBMBlock__10:
  411.     BTST    #$0,D4
  412.     BEQ.W    ReconPMBlock__24
  413. ReconBMBlock__11:
  414.     ADDQ.L    #$8,D6
  415.     BRA.W    ReconPMBlock__24
  416. ReconBMBlock__12:
  417.     MOVEQ.L    #$2,D0
  418.     AND.L    D1,D0
  419.     aSR.L    #$1,D0
  420.     MOVEQ.L    #$2,D3
  421.     LEA    $40(A7),A5
  422.     AND.L    (A5),D3
  423.     aSR.L    #$2,D1
  424.     MOVE.L    D1,$28(A7)
  425.     MOVE.L    (A5),D1
  426.     aSR.L    #$2,D1
  427.     lSL.L    #$3,D7
  428.     MOVE.L    D1,(A5)+
  429.     MOVE.L    D6,D1
  430.     lSL.L    #$3,D1
  431.     MOVE.L    D2,D6
  432.     lSL.L    #$3,D6
  433.     MOVE.L    D1,$38(A7)
  434.     MOVE.L    D0,$34(A7)
  435.     MOVE.L    D3,$30(A7)
  436.  
  437.     bra    ReconPMB_11
  438.  
  439.  
  440.  
  441.  
  442.  
  443. @ReconBiMBlock:
  444.     SUB.W    #$1c,A7
  445.     MOVEM.L    D2-D7/A2/A3/A5/A6,-(A7)
  446.     MOVE.L    D0,D4
  447.  
  448.     MOVE.L    $c(A0),D7
  449.     MOVE.L    $86(A0),D5
  450.     DIVS.w    D7,d5
  451.     moveq    #0,d6
  452.     move.w    d5,d6
  453.     swap    d5
  454.     ext.l    d5
  455.  
  456.     LEA    $2c(A7),A6
  457.     MOVE.L    $178(A0),A3
  458.     MOVE.L    D0,(A6)+
  459.     MOVE.L    D1,(A6)+
  460.     MOVE.L    A0,(A6)+
  461.     CMP.w    #4,D4
  462.     BGE.s    ReconBiMBlock__11
  463. ReconBiMBlock__2:
  464.     MOVE.L    (A3),a1
  465.  
  466.     MOVE.L    $170(A0),A6
  467.     MOVE.L    A6,D2
  468.     BEQ    ReconBiMBlock__23    ; no frame
  469.     MOVE.L    (A6),A3
  470.  
  471.     MOVE.L    $174(A0),A6
  472.     MOVE.L    A6,D2
  473.     BEQ    ReconBiMBlock__23
  474.     MOVE.L    (A6),A2
  475.  
  476.     lSL.L    #$4,D7
  477.     MOVE.L    D6,D0
  478.     lSL.L    #$4,D0
  479.     MOVE.L    D5,D6
  480.     lSL.L    #$4,D6
  481.     MOVE.L    D7,$3c(A7)
  482.     MOVE.L    D0,$40(A7)
  483.     CMP.w    #1,D4
  484.     BLE.s    ReconBiMBlock__8
  485. ReconBiMBlock__7:
  486.     ADDQ.L    #$8,$40(A7)
  487. ReconBiMBlock__8:
  488.     BTST    #$0,D4
  489.     BEQ.B    ReconBiMBlock__10
  490. ReconBiMBlock__9:
  491.     ADDQ.L    #$8,D6
  492. ReconBiMBlock__10:
  493.     MOVE.L    D1,D7
  494.     ASR.L    #$1,D7
  495.     LEA    $48(A7),A6
  496.     ADD.L    D6,D7
  497.     MOVE.L    (A6)+,D5
  498.     ASR.L    #$1,D5
  499.     MOVE.L    $40(A7),D0
  500.     ADD.L    D0,D5
  501.     MOVE.L    (A6)+,D1
  502.     ASR.L    #$1,D1
  503.     ADD.L    D6,D1
  504.     MOVE.L    (A6)+,D2
  505.     ASR.L    #$1,D2
  506.     ADD.L    D0,D2
  507.     MOVE.L    D2,$50(A7)
  508.     MOVE.L    D1,$4c(A7)
  509.     BRA    ReconBiMBlock__20
  510. ReconBiMBlock__11:
  511.     MOVE.L    D7,D2
  512.     lSL.L    #$3,D2
  513.     MOVE.L    D6,D3
  514.     lSL.L    #$3,D3
  515.     MOVE.L    D5,D6
  516.     lSL.L    #$3,D6
  517.     ASR.L    #$2,D1
  518.     LEA     $48(A7),A6
  519.     ADD.L    D6,D1
  520.     MOVE.L    D1,D7
  521.     MOVE.L    (A6)+,D5
  522.     ASR.L    #$2,D5
  523.     ADD.L    D3,D5
  524.     MOVE.L    (A6)+,D1
  525.     ASR.L    #$2,D1
  526.     ADD.L    D6,D1
  527.     MOVE.L    (A6)+,D0
  528.     ASR.L    #$2,D0
  529.     ADD.L    D3,D0
  530.     MOVE.L    D0,$50(A7)
  531.     MOVE.L    D1,$4c(A7)
  532.     MOVE.L    D2,$3c(A7)
  533.     MOVE.L    D3,$40(A7)
  534.     SUBQ.L    #$4,D4
  535.     BNE.s    ReconBiMBlock__16
  536. ReconBiMBlock__12:
  537.     MOVE.L    $4(A3),a1
  538.  
  539.     MOVE.L    $170(A0),A6
  540.     MOVE.L    A6,D1
  541.     BEQ    ReconBiMBlock__23
  542.     MOVE.L    $4(A6),A3
  543.  
  544.     MOVE.L    $174(A0),A6
  545.     MOVE.L    A6,D1
  546.     BEQ    ReconBiMBlock__23
  547.     MOVE.L    $4(A6),A2
  548.     BRA.B     ReconBiMBlock__20
  549.  
  550. ReconBiMBlock__16:
  551.     MOVE.L    $8(A3),a1
  552.  
  553.     MOVE.L    $170(A0),A6
  554.     MOVE.L    A6,D1
  555.     BEQ    ReconBiMBlock__23
  556.     MOVE.L    $8(A6),A3
  557.  
  558.     MOVE.L    $174(A0),A6
  559.     MOVE.L    A6,D1
  560.     BEQ    ReconBiMBlock__23
  561.     MOVE.L    $8(A6),A2
  562.  
  563. ReconBiMBlock__20:
  564.  
  565.     MOVE.L    $3c(A7),D2
  566.     MOVE.L    $40(A7),D1
  567.     MULS.w    D2,D1
  568.     ADD.L    D6,D1
  569.     MULS.w    D2,D5
  570.     ADD.L    D1,A1
  571.     MOVE.L    A1,A5
  572.     ADD.L    D7,D5
  573.     MOVE.L    $50(A7),D1
  574.     MULS.w    D2,D1
  575.     ADD.L    D5,A3
  576.     ADD.L    $4c(A7),D1
  577.     ADD.L    D1,A2
  578.  
  579.     subq.l    #8,d2            ; correct row_size
  580.     move.l    #$fefefefe,d4
  581.     moveq    #7,d0
  582.  
  583.     TST.L    $54(A7)
  584.     BNE    ReconBiMBlock__22
  585. ReconBiMBlock__21:
  586.  
  587.     LEA    $d2(A0),A1
  588.  
  589.     lea    _clamp,a0
  590. bimcm_all_rows3:
  591.     REPT    2
  592.     move.l    (a3)+,d1
  593.     move.l    (a2)+,d3
  594.     and.l    d4,d1
  595.     and.l    d4,d3
  596.     add.l    d1,d3
  597.     roxr.l    #1,d3        ; tricky! get bit #32 from the previous addition
  598.     moveq    #0,d1
  599.     move.b    d3,d1
  600.     lsr.l    #8,d3
  601.     moveq    #0,d6
  602.     move.b    d3,d6
  603.     lsr.w    #8,d3        ; *grin evilly*  eadiz, peecee  *strut*
  604.     add.l    (a1)+,d3
  605.     move.w    d3,d7
  606.     swap    d3
  607.     move.w    (a0,d3.w*2),d3
  608.     move.b    (a0,d7.w*2),d3
  609.     swap    d3
  610.     add.w    (a1)+,d6
  611.     add.w    (a1)+,d1
  612.     move.w    (a0,d6.w*2),d3
  613.     move.b    (a0,d1.w*2),d3
  614.     move.l    d3,(a5)+
  615.     ENDR
  616.     add.l    d2,a5
  617.     add.l    d2,a3
  618.     add.l    d2,a2
  619.     dbra    d0,bimcm_all_rows3
  620.  
  621.     BRA.s    ReconBiMBlock__23
  622. ReconBiMBlock__22:
  623.  
  624. bim_all_rows3:
  625.     REPT    2
  626.     move.l    (a3)+,d1
  627.     move.l    (a2)+,d7
  628.     and.l    d4,d1
  629.     and.l    d4,d7
  630.     add.l    d1,d7
  631.     roxr.l    #1,d7            ; tricky! get bit no 32 from the previous addition
  632.     move.l    d7,(a5)+        ; this one kicks ass !!!
  633.     ENDR
  634.     add.l    d2,a5
  635.     add.l    d2,a3
  636.     add.l    d2,a2
  637.     dbra    d0,bim_all_rows3
  638.  
  639. ReconBiMBlock__23:
  640.     MOVEM.L    (A7)+,D2-D7/A2/A3/A5/A6
  641.     ADD.W    #$1c,A7
  642.     RTS
  643.  
  644.  
  645.     END
  646.